xg.menu=function(o){
	// let $that=$(this);
	let ul=xg.ul('xg-bg-white xg-radius-2 xg-border-c xg-pd-1').css({cursor:'pointer',minHeight:'1.2rem',minWidth:'4rem'});
	let popOutTimer=0,itemOutTimer=0;
	if(o.items){
		for(let i in o.items){
			const item=o.items[i];
			let li=xg.li('xg-pd-1 xg-hover-black-1 xg-radius-1 xg-lh-1 xg-clear xg-nowrap').html(item.name).click(item.click).mouseenter(function(){
				let menu;
				if(xg.isfun(item.enter)){
					if(item.enter()!==false){
						children();
					}
				}else{
					children();
				}
				clearTimeout(popOutTimer);
				function children(){
					if(item.children&&item.children.length){
						let x=$that.parents('.xg-popup').width()+o.x;
						let y=$that.position().top;
						let op={x,y,items:item.children}
						menu=xg.menu(op);
						menu.d.mouseenter(function(){
							clearTimeout(popOutTimer);
							clearTimeout(itemOutTimer);
						});
					}
				}
				// $that.one('mouseleave',function(e){
				// 	clearTimeout(popOutTimer);
				// 	if(Math.abs(e.clientX-o.x)>300 || Math.abs(e.clientY-o.y)>300){
				// 		console.log(e.clientX-o.x,e.clientY-o.y);
				// 		itemOutTimer=setTimeout(function() {
				// 			if(menu && xg.isfun(menu.close)) {
				// 				menu.close();
				// 			}
				// 		},200);
				// 	}
				// });
			});
			ul.append(li);
		}
	}
	let pop=xg.popup(o).up({left:o.x,top:o.y,class:'xg-pd-1 xg-z-9-8',html:ul});
	window.xg_menu_ins=window.xg_menu_ins||[];
	window.xg_menu_ins.push(pop);
	$(document).one('click',function(){
		pop.remove();
	})
	// .mouseleave(function(e){
	// 	if(Math.abs(e.clientX-o.x)>200 || Math.abs(e.clientY-o.y)>200){
	// 		popOutTimer=setTimeout(function(){
	// 			if(xg.isfun(pop.close)){
	// 				pop.close();
	// 			}else{
	// 				pop.remove();
	// 			}
	// 		},200);
	// 	}else{
	// 		clearTimeout(popOutTimer);
	// 	}
	// });
	return pop;
}
xg.menu.clear=function(){
	window.xg_menu_ins=window.xg_menu_ins||[];
	for(let pop of window.xg_menu_ins){
		pop.remove();
	}
	window.xg_menu_ins=[];
};
xg.popup=function(o){
	const P=function(args){
		const s=this;
		s.o={};
		for(var i in args){
			let a=args[i];
			if(xg.isstr(a)){
				s.o.html=a;
			}else if(a instanceof jQuery){
				s.o.html=a;
			}else if(xg.isobj(a)){
				s.o=$.extend({},s.o,a);
			}
		}
		if(!xg.iseobj(s.o))this.up();
	};
	P.prototype.up=function(){
		const s=this;
		for(var i in arguments){
			let a=arguments[i];
			if(xg.isstr(a)){
				s.o.html=a;
			}else if(a instanceof jQuery){
				s.o.html=a;
			}else if(xg.isobj(a)){
				s.o=$.extend({},s.o,a);
			}
		}
		window.xg_popup_ids=window.xg_popup_ids||[];
		var id=window.xg_popup_ids.length;
		s.id=id;
		window.xg_popup_ids.push(id);
		css={};
		for(let n of ['width','height','left','top','zIndex','maxWidth','maxHeight','minWidth','minHeight']){
			if(s.o[n]){
				css[n]=s.o[n];
			}
		}
		if(s.d&&s.d.length)s.d.remove();
		s.d=xg.div('xg-popup xg-pos-f xg-popup-'+id).addClass(s.o.class).css(css).append(s.o.html||'').mouseenter(function(){
			s.enter=true;
		}).mouseleave(function(){
			s.enter=false;
		});
		return s;
	};
	P.prototype.show=function(){
		var s=this;
		s.d.show();
		return s;
	};
	P.prototype.hide=P.prototype.close=function(){
		var s=this;
		s.d.hide();
		return s;
	};
	P.prototype.remove=function(){
		var s=this;
		s.d.remove();
		return s;
	};
	return new P(arguments);
};